#!/bin/bash
set -e

# 获取脚本所在目录的绝对路径
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
PATCHES_DIR="${SCRIPT_DIR}/patches"

# 初始化子模块（确保存在）
git submodule update --init --force --recursive

# 遍历 .gitmodules 中所有子模块的路径
git config --file .gitmodules --get-regexp "submodule\..*\.path" | while read -r config_key submodule_path; do
    # 生成补丁文件名：将路径中的 "/" 替换为 "_"
    patch_filename=$(echo "${submodule_path}" | sed 's/\//_/g').patch
    patch_file="${PATCHES_DIR}/${patch_filename}"

    # 检查补丁文件是否存在
    if [ -f "${patch_file}" ]; then
        # 获取子模块的绝对路径
        submodule_abs_path="${SCRIPT_DIR}/${submodule_path}"
        echo "正在处理子模块：${submodule_path}"

        # 进入子模块目录并应用补丁
        (
            cd "${submodule_abs_path}"
            echo "应用补丁：${patch_filename}"
            if git apply --check "${patch_file}"; then
                git am -3 "${patch_file}"
                echo "✅ 补丁应用成功"
            else
                echo "❌ 错误：补丁无法应用，请检查冲突！"
                exit 1  # 严格模式下会终止脚本
            fi
        )
    else
        echo "跳过：未找到子模块 ${submodule_path} 的补丁文件 ${patch_filename}"
    fi
done

echo "所有补丁处理完成！"

cd $SCRIPT_DIR

# 检查当前目录下是否存在 build 目录
if [ -d "build" ]; then
    echo "检测到 build 目录，正在删除..."
    rm -rf build
    echo "已删除 build 目录"
else
    echo "未找到 build 目录，无需清理"
fi

# 检查当前目录下是否存在 output 目录
if [ -d "output" ]; then
    echo "检测到 output 目录，正在删除..."
    rm -rf output
    echo "已删除 output 目录"
else
    echo "未找到 output 目录，无需清理"
fi

mkdir build && cd build
../configure --disable-werror --extra-cflags="-O3" --target-list=aarch64-softmmu --with-git-submodules=ignore --enable-virtfs --enable-slirp
make -j16